home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / snip1292.zip / RAND2.C < prev    next >
Text File  |  1992-12-26  |  1KB  |  46 lines

  1. /********************************************************************
  2.           The McGill Super-Duper Random Number Generator
  3.              G. Marsaglia, K. Ananthanarayana, N. Paul
  4.   
  5.     Incorporating the Ziggurat method of sampling from decreasing
  6.               or symmetric unimodal density functions.
  7.                       G. Marsaglia, W.W. Tsang
  8.   
  9.                  Rewritten into C by E. Schneider
  10.  *********************************************************************/
  11.   
  12.  static unsigned long mcgn, srgn;
  13.   
  14.  #define MULT 69069L
  15.   
  16.  void rstart (i1, i2)
  17.  long i1, i2;
  18.   
  19.  { mcgn = (i1 == 0) ? 0 : i1 | 1;
  20.    srgn = (i2 == 0) ? 0 : (i2 & 0x7FF) | 1;
  21.   }
  22.   
  23.  long uni()
  24.  { unsigned long r0, r1;
  25.    r0 = (srgn >> 15);
  26.    r1 = srgn ^ r0;
  27.    r0 = (r1 << 17);
  28.    srgn = r0 ^ r1;
  29.    mcgn = MULT * mcgn;
  30.    r1 = mcgn ^ srgn;
  31.    return (r1 >> 1);  }
  32.   
  33.  long vni()
  34.  { unsigned long r0, r1;
  35.    r0 = (srgn >> 15);
  36.    r1 = srgn ^ r0;
  37.    r0 = (r1 << 17);
  38.    srgn = r0 ^ r1;
  39.    mcgn = MULT * mcgn;
  40.    r1 = mcgn ^ srgn;
  41.    return r1;  }
  42. /* 
  43. "Anyone who consider arithmetic means of producing random number is,
  44.  of course, in a state of sin" - John Von Neumann
  45. */
  46.